/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.sele.manager;

import com.brain.core.manager.*;
import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.view.util.ConstantesCore;
import com.brain.sele.dto.PostulanteDto;
import com.brain.sele.dto.RequerimientoDto;
import com.brain.sele.view.util.ConstantesSele;
import com.brain.sgc.dto.PersonaDto;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

/**
 *
 * @author Hvives
 */
@Service
public class PostulanteManager extends ComunManager<PostulanteDto> implements Serializable {

    private static Logger logger = Logger.getLogger(PostulanteManager.class);
    @Resource
    private DAOGenerico<PostulanteDto> springHibernateDao;

    public PostulanteDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(PostulanteDto.class, id);
    }

    public List<PostulanteDto> obtenerPostulantesPorRequerimiento(Long idReq) throws DAOException {
        List<PostulanteDto> lista = null;
        Map<String, Object> mapFiltro = new HashMap<String, Object>();

        mapFiltro.put("requerimientoDto.id", idReq);

        Map<String, String> mapOrden = new HashMap<String, String>();
        mapOrden.put("personaDto.apellidoPaterno", "asc");

        try {
            lista = obtenerConFiltroConOrden(mapFiltro, mapOrden);
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);

        }
        return lista;
    }

    public List<PostulanteDto> obtenerPostulantesAprobadosYSeleccionadosPorConv(Long idConv) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();

        String hqsql = "select e from PostulanteDto as e ";
        hqsql += " where e.requerimientoDto.convocatoriaDto.id = ? and (e.estadoDto.id = ? or e.estadoDto.id = ? )";
        listaParametros.add(idConv);
        listaParametros.add(ConstantesSele.Parametro.POST_ESTADO_APROBADO);
        listaParametros.add(ConstantesSele.Parametro.POST_ESTADO_SELECCIONADO);
        //hqsql += " group by e.requerimientoDto";
        hqsql += " order by e.requerimientoDto.puestoDto.descripcion desc,e.notaFinal desc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);

    }

    public List<PostulanteDto> obtenerPostulantesPorConv(Long idConv) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();

        String hqsql = "select e from PostulanteDto as e ";
        hqsql += " where e.requerimientoDto.convocatoriaDto.id = ?";
        listaParametros.add(idConv);
        hqsql += " order by e.requerimientoDto.descripcion desc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);

    }
    
    public int obtenerCantPostulantesPorConv(Long idConv) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();

        String hqsql = "select count(e.id) from PostulanteDto as e ";
        hqsql += " where e.requerimientoDto.convocatoriaDto.id = ?";
        listaParametros.add(idConv);
        return Integer.parseInt(springHibernateDao.ejecutarQueryGeneric(hqsql, listaParametros).get(0).toString());
    }
    
     public int obtenerCantPostulantesPorRequerimiento(Long idReq) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();

        String hqsql = "select count(e.id) from PostulanteDto as e ";
        hqsql += " where e.requerimientoDto.id = ?";
        listaParametros.add(idReq);
        return Integer.parseInt(springHibernateDao.ejecutarQueryGeneric(hqsql, listaParametros).get(0).toString());
    }
    
     public int verificarPostEnRequerimiento(Long idPerson, Long idReq) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();

        String hqsql = "select count(e.id) from PostulanteDto as e ";
        hqsql += " where e.requerimientoDto.id = ? and e.personaDto.id = ? ";
        listaParametros.add(idReq);
        listaParametros.add(idPerson);
        return Integer.parseInt(springHibernateDao.ejecutarQueryGeneric(hqsql, listaParametros).get(0).toString());
    }

    public List<PostulanteDto> obtenerPostPorContratar(PersonaDto dtoPerson, RequerimientoDto dtoReq) throws DAOException {
        List<PostulanteDto> lista = null;
        Map<String, Object> mapFiltro = new HashMap<String, Object>();

        if (dtoPerson.getTipoDocumentoDto().getId() != null && !dtoPerson.getTipoDocumentoDto().getId().equals(0L) && !dtoPerson.getTipoDocumentoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            mapFiltro.put("personaDto.tipoDocumentoDto.id", dtoPerson.getTipoDocumentoDto().getId());
        }

        if (dtoPerson.getNumeroDocumento() != null && dtoPerson.getNumeroDocumento().length() != 0) {
            mapFiltro.put("personaDto.numeroDocumento", dtoPerson.getNumeroDocumento());
        }

        if (dtoPerson.getNombreCompleto() != null && dtoPerson.getNombreCompleto().length() != 0) {
            mapFiltro.put("personaDto.nombreCompleto", dtoPerson.getNombreCompleto());
        }

        if (dtoPerson.getSexoDto().getId() != null && !dtoPerson.getSexoDto().getId().equals(0L) && !dtoPerson.getSexoDto().getId().equals(99L)) {
            mapFiltro.put("personaDto.sexoDto.id", dtoPerson.getSexoDto().getId());
        }

        if (dtoReq.getSedeDto().getId() != null && !dtoReq.getSedeDto().getId().equals(0L) && !dtoReq.getSedeDto().getId().equals(99L)) {
            mapFiltro.put("requerimientoDto.sedeDto.id", dtoReq.getSedeDto().getId());
        }


        if (dtoReq.getModalidadContratacionDto().getId() != null && !dtoReq.getModalidadContratacionDto().getId().equals(0L) && !dtoReq.getModalidadContratacionDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            mapFiltro.put("requerimientoDto.modalidadContratacionDto.id", dtoReq.getModalidadContratacionDto().getId());
        }

        mapFiltro.put("estadoDto.id", ConstantesSele.Parametro.POST_ESTADO_POR_CONTRATAR);

        Map<String, String> mapOrden = new HashMap<String, String>();
        mapOrden.put("personaDto.nombreCompleto", "asc");

        try {
            lista = obtenerConFiltroConOrden(mapFiltro, mapOrden);
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);

        }
        return lista;
    }

    public List<PostulanteDto> obtenerPostulantesPorPersona(Long idPerson) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();

        String hqsql = "select e from PostulanteDto as e ";
        hqsql += " where e.personaDto.id = ? and e.estadoDto.id <> ? ";
        listaParametros.add(idPerson);
        listaParametros.add(ConstantesSele.Parametro.POST_ESTADO_CANCELADO);
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);

    }

    public List<PostulanteDto> obtenerPostulantesAprobadosPorReq(Long idReq) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();

        String hqsql = "select e from PostulanteDto as e ";
        hqsql += " where e.requerimientoDto.id = ? and e.estadoDto.id = ?";
        hqsql += " order by e.notaFinal desc";
        listaParametros.add(idReq);
        listaParametros.add(ConstantesSele.Parametro.POST_ESTADO_APROBADO);
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);

    }
    
    public List<PostulanteDto> obtenerPostulantesAprobadosYSeleccionadosPorReq(Long idReq) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();

        String hqsql = "select e from PostulanteDto as e ";
        hqsql += " where e.requerimientoDto.id = ? and  (e.estadoDto.id = ? or e.estadoDto.id = ?) ";
        hqsql += " order by e.notaFinal desc";
        listaParametros.add(idReq);
        listaParametros.add(ConstantesSele.Parametro.POST_ESTADO_APROBADO);
        listaParametros.add(ConstantesSele.Parametro.POST_ESTADO_SELECCIONADO);
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);

    }

    public List<PostulanteDto> obtenerConFiltroConOrden(Map<String, Object> filtros, Map<String, String> orden) throws DAOException {
        return springHibernateDao.obtenerDtosConFiltrosConOrden(PostulanteDto.class, filtros, orden);
    }

    public void nuevoMuchos(List<PostulanteDto> lista) throws DAOException {
        springHibernateDao.guardarColeccion(lista);
    }

    public void eliminarMuchos(List<PostulanteDto> lista) throws DAOException {
        springHibernateDao.borrarColeccion(lista);
    }
}
